package com.qf.webscoket;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.socket.*;
import org.springframework.web.socket.config.annotation.EnableWebSocket;

import java.util.HashMap;
import java.util.Map;


// 这个类是用来接受 webscoket 请求的
//实现了接口
@Component
@EnableWebSocket
public class MyWebScoketClient implements WebSocketHandler {
    private Map<String, WebSocketSession> allClient = new HashMap();
    private ObjectMapper objectMapper = new ObjectMapper();

    //
    //当我们的客户端和服务端建立 webscoket d连接之后执行
//    当前建立的会话连接
    @Override
    public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
        System.out.println("恭喜武汉X同学获得2021 第一位知道高考成绩的成就");
//     当我们保存的时候发现需要唯一的标识 也就是保存张三会话的时候需要知道张三
        System.out.println("这是" + webSocketSession);
        String url = webSocketSession.getUri().toString();
        System.out.println("路径" + url);
        String name = url.substring(url.lastIndexOf("/") + 1);//从地址的最后一个/ 后面开始切割 要最后以为数据  就是我们的名字
        System.out.println("名字" + name);
        allClient.put(name, webSocketSession);//保存了会话

    }

    //    服务端收到了客户端发送的消息
    @Override
    public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {

        System.out.println("收到你发给客服的骚扰信息了");

//        我们现在的目的是 比如说收到了张三给李四发的消息 我们需要找到李四的会话然后发过去
//        我们怎么知道消息是发给谁的 所以我们也要定义 消息的格式  要求发送方必须按照这个格式发送内容
        String json = (String) webSocketMessage.getPayload();
        System.out.println("收到的" + json);//收到的{"touser":"22","msg":"333"}
        Map map = objectMapper.readValue(json, Map.class);
        String touser = (String) map.get("touser");//获取到收消息的用户
        System.out.println("收到的消息" + touser);//收到的消息22
        String msg = (String) map.get("msg");// 获取消息

        WebSocketSession session = allClient.get(touser);// 获取到收消息人的会话
        System.out.println("session" + session);//sessionStandardWebSocketSession[id=97c742f2-fb5b-164c-f23f-76d1c51ae966, uri=ws://localhost:8080/websocket/22]

        if (session != null && session.isOpen()) {
            String url = webSocketSession.getUri().toString();
            System.out.println("sessiona啊" + url);//sessiona啊ws://localhost:8080/websocket/11
            String name = url.substring(url.lastIndexOf("/") + 1);//从地址的最后一个/ 后面开始切割 要最后以为数据  就是我们的名字
            //要确保对方在线
            session.sendMessage(new TextMessage("收到了来自于" + name
                    + "的消息" + "d内容" + msg));
        } else {
            //对方不在线 给发送者回一个消息
            webSocketSession.sendMessage(new TextMessage("对方暂时无法接通"));
        }

    }

    //    出现了异常执行
    @Override
    public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception {

    }


    //    客户端和服务端关闭了连接
    @Override
    public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
        System.out.println("你和客服中断了联系");
    }

    //
    @Override
    public boolean supportsPartialMessages() {
        return false;
    }
}
